<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Function object</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Function_object"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Function_object rootpage-Function_object skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Function object</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<style data-mw-deduplicate="TemplateStyles:r1236090951">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><div role="note" class="hatnote navigation-not-searchable">This article is about the computer programming concept of function objects. For functors in mathematics, see <a href="Functor" title="Functor">Functor</a>. For the related concept in functional programming, see <a href="Functor_(functional_programming)" title="Functor (functional programming)">Functor (functional programming)</a>.</div>
<style data-mw-deduplicate="TemplateStyles:r1305433154">
/* start https://en.wikipedia.org/ */
.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}@media print{body.ns-0 .mw-parser-output .ambox{display:none!important}}
/* end https://en.wikipedia.org/ */
</style>
<p>In <a href="Computer_programming" title="Computer programming">computer programming</a>, a <b>function object</b><sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>a<span class="cite-bracket">]</span></a></sup> is a construct allowing an <a href="Object_(computer_science)" title="Object (computer science)">object</a> to be invoked or called as if it were an ordinary <a href="Subroutine" class="mw-redirect" title="Subroutine">function</a>, usually with the same syntax (a function parameter that can also be a function). In some languages, particularly C++, function objects are often called <b>functors</b> (not related to <a href="Functor_(functional_programming)" title="Functor (functional programming)">the functional programming concept</a>).
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Description">Description</h2></div>
<p>A typical use of a function object is in writing <a href="Callback_(computer_science)" class="mw-redirect" title="Callback (computer science)">callback</a> functions. A callback in <a href="Procedural_programming" title="Procedural programming">procedural languages</a>, such as <a href="C_(programming_language)" title="C (programming language)">C</a>, may be performed by using <a href="Function_pointer" title="Function pointer">function pointers</a>.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> However it can be difficult or awkward to pass a state into or out of the callback function. This restriction also inhibits more dynamic behavior of the function. A function object solves those problems since the function is really a <a href="Facade_pattern" title="Facade pattern">façade</a> for a full object, carrying its own state.
</p><p>Many modern (and some older) languages, e.g. <a href="C%2B%2B" title="C++">C++</a>, <a href="Eiffel_(programming_language)" title="Eiffel (programming language)">Eiffel</a>, <a href="Groovy_(programming_language)" class="mw-redirect" title="Groovy (programming language)">Groovy</a>, <a href="Lisp_(programming_language)" title="Lisp (programming language)">Lisp</a>, <a href="Smalltalk" title="Smalltalk">Smalltalk</a>, <a href="Perl" title="Perl">Perl</a>, <a href="PHP" title="PHP">PHP</a>, <a href="Python_(programming_language)" title="Python (programming language)">Python</a>, <a href="Ruby_(programming_language)" title="Ruby (programming language)">Ruby</a>, <a href="Scala_(programming_language)" title="Scala (programming language)">Scala</a>, and many others, support <a href="First-class_function" title="First-class function">first-class function</a> objects and may even make significant use of them.<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> <a href="Functional_programming" title="Functional programming">Functional programming</a> languages additionally support <a href="Closure_(computer_science)" class="mw-redirect" title="Closure (computer science)">closures</a>, i.e. first-class functions that can 'close over' variables in their surrounding environment at creation time. During compilation, a transformation known as <a href="Lambda_lifting" title="Lambda lifting">lambda lifting</a> converts the closures into function objects.
</p>
<div class="mw-heading mw-heading2"><h2 id="In_C_and_C++">In C and C++</h2></div>
<p>Consider the example of a sorting routine that uses a callback function to define an ordering relation between a pair of items. The following C/C++ program uses function pointers:
</p>
<div class="mw-highlight mw-highlight-lang-c mw-content-ltr" dir="ltr"><pre><span class="cp">#include</span><span class="w"> </span><span class="cpf"><stdlib.h></span>
<span class="cm">/* qsort() callback function, returns < 0 if a < b, > 0 if a > b, 0 if a == b */</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">compareInts</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">void</span><span class="o">*</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">void</span><span class="o">*</span><span class="w"> </span><span class="n">b</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="o">*</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">a</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="o">*</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="o">*</span><span class="p">)</span><span class="n">b</span><span class="w"> </span><span class="p">);</span>
<span class="p">}</span>
<span class="p">...</span>
<span class="c1">// prototype of qsort is</span>
<span class="c1">// void qsort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *));</span>
<span class="p">...</span>
<span class="kt">int</span><span class="w"> </span><span class="n">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">items</span><span class="p">[]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="n">qsort</span><span class="p">(</span><span class="n">items</span><span class="p">,</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">items</span><span class="p">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">items</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span><span class="w"> </span><span class="k">sizeof</span><span class="p">(</span><span class="n">items</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span><span class="w"> </span><span class="n">compareInts</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>In C++, a function object may be used instead of an ordinary function by defining a class that <a href="Operator_overloading" title="Operator overloading">overloads</a> the <a href="Function_call_operator" class="mw-redirect" title="Function call operator">function call operator</a> by defining an <code>operator()</code> member function. In C++, this may appear as follows:
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span class="c1">// comparator predicate: returns true if a < b, false otherwise</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">IntComparator</span>
<span class="p">{</span>
<span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="nf">operator</span><span class="p">()(</span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">&</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">&</span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="k">const</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">b</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">};</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="n">items</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">items</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span><span class="w"> </span><span class="n">items</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span><span class="w"> </span><span class="n">IntComparator</span><span class="p">());</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>Notice that the syntax for providing the callback to the <code>std::sort()</code> function is identical, but an object is passed instead of a function pointer. When invoked, the callback function is executed just as any other member function, and therefore has full access to the other members (data or functions) of the object. Of course, this is just a trivial example. To understand what power a functor provides more than a regular function, consider the common use case of sorting objects by a particular field. In the following example, a functor is used to sort a simple employee database by each employee's ID number.
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span class="k">struct</span><span class="w"> </span><span class="nc">CompareBy</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="w"> </span><span class="n">SORT_FIELD</span><span class="p">;</span>
<span class="w"> </span><span class="n">CompareBy</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&</span><span class="w"> </span><span class="n">sort_field</span><span class="o">=</span><span class="s">"name"</span><span class="p">)</span>
<span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">SORT_FIELD</span><span class="p">(</span><span class="n">sort_field</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="cm">/* validate sort_field */</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span>
<span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="k">operator</span><span class="p">()(</span><span class="k">const</span><span class="w"> </span><span class="n">Employee</span><span class="o">&</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">Employee</span><span class="o">&</span><span class="w"> </span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="k">const</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">SORT_FIELD</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s">"name"</span><span class="p">)</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">name</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">name</span><span class="p">;</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">SORT_FIELD</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s">"age"</span><span class="p">)</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">age</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">age</span><span class="p">;</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">SORT_FIELD</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s">"idnum"</span><span class="p">)</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">idnum</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">idnum</span><span class="p">;</span>
<span class="w"> </span><span class="k">else</span>
<span class="w"> </span><span class="cm">/* throw exception or something */</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">};</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">Employee</span><span class="o">></span><span class="w"> </span><span class="n">emps</span><span class="p">;</span>
<span class="w"> </span>
<span class="w"> </span><span class="cm">/* code to populate database */</span>
<span class="w"> </span>
<span class="w"> </span><span class="c1">// Sort the database by employee ID number</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">emps</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span><span class="w"> </span><span class="n">emps</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span><span class="w"> </span><span class="n">CompareBy</span><span class="p">(</span><span class="s">"idnum"</span><span class="p">));</span>
<span class="w"> </span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p>In <a href="C%2B%2B11" title="C++11">C++11</a>, the lambda expression provides a more succinct way to do the same thing.
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">Employee</span><span class="o">></span><span class="w"> </span><span class="n">emps</span><span class="p">;</span>
<span class="w"> </span><span class="cm">/* code to populate database */</span>
<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="w"> </span><span class="n">sort_field</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"idnum"</span><span class="p">;</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">emps</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span><span class="w"> </span><span class="n">emps</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span><span class="w"> </span><span class="p">[</span><span class="o">&</span><span class="n">sort_field</span><span class="p">](</span><span class="k">const</span><span class="w"> </span><span class="n">Employee</span><span class="o">&</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="n">Employee</span><span class="o">&</span><span class="w"> </span><span class="n">b</span><span class="p">)</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="cm">/* code to select and compare field */</span><span class="w"> </span><span class="p">});</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<p><br>
It is possible to use function objects in situations other than as callback functions. In this case, the shortened term <i>functor</i> is normally <i>not</i> used about the function object. Continuing the example,
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span class="n">IntComparator</span><span class="w"> </span><span class="n">cpm</span><span class="p">;</span>
<span class="kt">bool</span><span class="w"> </span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">cpm</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">);</span>
</pre></div>
<p>In addition to class type functors, other kinds of function objects are also possible in C++. They can take advantage of C++'s member-pointer or <a href="Generic_programming" title="Generic programming">template</a> facilities. The expressiveness of templates allows some <a href="Functional_programming" title="Functional programming">functional programming</a> techniques to be used, such as defining function objects in terms of other function objects (like <a href="Function_composition_(computer_science)" title="Function composition (computer science)">function composition</a>). Much of the C++ <a href="Standard_Template_Library" title="Standard Template Library">Standard Template Library</a> (STL) makes heavy use of template-based function objects.
</p><p>Another way to create a function object in C++ is to define a non-explicit conversion function to a function pointer type, a function <a href="Reference_(C%2B%2B)" title="Reference (C++)">reference</a> type, or a reference to function pointer type. Assuming the conversion does not discard <a href="Type_qualifier" title="Type qualifier">cv-qualifiers</a>, this allows an object of that type to be used as a function with the same <a href="Function_signature" class="mw-redirect" title="Function signature">signature</a> as the type it is converted to. Modifying an earlier example to use this we obtain the following class, whose instances can be called like function pointers:<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span class="c1">// comparator predicate: returns true if a < b, false otherwise</span>
<span class="k">struct</span><span class="w"> </span><span class="nc">IntComparator</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="nf">compare</span><span class="p">(</span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">&</span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="o">&</span><span class="n">b</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">b</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">decltype</span><span class="p">(</span><span class="n">compare</span><span class="p">);</span>
<span class="w"> </span><span class="k">operator</span><span class="w"> </span><span class="n">T</span><span class="o">*</span><span class="p">()</span><span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">compare</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<span class="p">};</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="n">items</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">items</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span><span class="w"> </span><span class="n">items</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span><span class="w"> </span><span class="n">IntComparator</span><span class="p">());</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Maintaining_state">Maintaining state</h3></div>
<p>Another advantage of function objects is their ability to maintain a state that affects <code>operator()</code> between calls. For example, the following code defines a <a href="Generator_(computer_science)" class="mw-redirect" title="Generator (computer science)">generator</a> counting from 10 upwards and is invoked 11 times.
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span class="cp">#include</span><span class="w"> </span><span class="cpf"><algorithm></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><iostream></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><iterator></span>
<span class="k">class</span><span class="w"> </span><span class="nc">CountFrom</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">public</span><span class="o">:</span>
<span class="w"> </span><span class="n">CountFrom</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">count</span><span class="p">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">count_</span><span class="p">(</span><span class="n">count</span><span class="p">)</span><span class="w"> </span><span class="p">{}</span>
<span class="w"> </span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="k">operator</span><span class="p">()()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">count_</span><span class="o">++</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">private</span><span class="o">:</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count_</span><span class="p">;</span>
<span class="p">};</span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">const</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">state</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">generate_n</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream_iterator</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="p">,</span><span class="w"> </span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">),</span><span class="w"> </span><span class="mi">11</span><span class="p">,</span>
<span class="w"> </span><span class="n">CountFrom</span><span class="p">(</span><span class="n">state</span><span class="p">));</span>
<span class="p">}</span>
</pre></div>
<p>In C++14 or later, the example above could be rewritten as:
</p>
<div class="mw-highlight mw-highlight-lang-cpp mw-content-ltr" dir="ltr"><pre><span class="cp">#include</span><span class="w"> </span><span class="cpf"><algorithm></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><iostream></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf"><iterator></span>
<span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">generate_n</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ostream_iterator</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">cout</span><span class="p">,</span><span class="w"> </span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">),</span><span class="w"> </span><span class="mi">11</span><span class="p">,</span>
<span class="w"> </span><span class="p">[</span><span class="n">count</span><span class="o">=</span><span class="mi">10</span><span class="p">]()</span><span class="w"> </span><span class="k">mutable</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">count</span><span class="o">++</span><span class="p">;</span><span class="w"> </span><span class="p">});</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="In_C#">In C#</h2></div>
<p>In <a href="C_Sharp_(programming_language)" title="C Sharp (programming language)">C#</a>, function objects are declared via <a href="Delegate_(CLI)" title="Delegate (CLI)">delegates</a>. A delegate can be declared using a named method or a <a href="Lambda_(programming)" class="mw-redirect" title="Lambda (programming)">lambda expression</a>. Here is an example using a named method.
</p>
<div class="mw-highlight mw-highlight-lang-csharp mw-content-ltr" dir="ltr"><pre><span class="k">using</span><span class="w"> </span><span class="nn">System</span><span class="p">;</span>
<span class="k">using</span><span class="w"> </span><span class="nn">System.Collections.Generic</span><span class="p">;</span>
<span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">ComparisonClass1</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">CompareFunction</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">y</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">y</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Main</span><span class="p">()</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">items</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="n">Comparison</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="n">del</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">CompareFunction</span><span class="p">;</span>
<span class="w"> </span><span class="n">items</span><span class="p">.</span><span class="n">Sort</span><span class="p">(</span><span class="n">del</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<p>Here is an example using a lambda expression.
</p>
<div class="mw-highlight mw-highlight-lang-csharp mw-content-ltr" dir="ltr"><pre><span class="k">using</span><span class="w"> </span><span class="nn">System</span><span class="p">;</span>
<span class="k">using</span><span class="w"> </span><span class="nn">System.Collections.Generic</span><span class="p">;</span>
<span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">ComparisonClass2</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Main</span><span class="p">()</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">var</span><span class="w"> </span><span class="n">items</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w"> </span><span class="mi">3</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="n">items</span><span class="p">.</span><span class="n">Sort</span><span class="p">((</span><span class="n">x</span><span class="p">,</span><span class="w"> </span><span class="n">y</span><span class="p">)</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">y</span><span class="p">);</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="In_D">In D</h2></div>
<p><a href="D_(programming_language)" title="D (programming language)">D</a> provides several ways to declare function objects: Lisp/Python-style via <a href="Closure_(computer_science)" class="mw-redirect" title="Closure (computer science)">closures</a> or C#-style via <a href="Delegate_(CLI)" title="Delegate (CLI)">delegates</a>, respectively:
</p>
<div class="mw-highlight mw-highlight-lang-d mw-content-ltr" dir="ltr"><pre><span class="kt">bool</span><span class="w"> </span><span class="n">find</span><span class="p">(</span><span class="n">T</span><span class="p">)(</span><span class="n">T</span><span class="p">[]</span><span class="w"> </span><span class="n">haystack</span><span class="p">,</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="k">delegate</span><span class="p">(</span><span class="n">T</span><span class="p">)</span><span class="w"> </span><span class="n">needle_test</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">straw</span><span class="p">;</span><span class="w"> </span><span class="n">haystack</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">needle_test</span><span class="p">(</span><span class="n">straw</span><span class="p">))</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">void</span><span class="w"> </span><span class="n">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="p">[]</span><span class="w"> </span><span class="n">haystack</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">[</span><span class="mi">345</span><span class="p">,</span><span class="w"> </span><span class="mi">15</span><span class="p">,</span><span class="w"> </span><span class="mi">457</span><span class="p">,</span><span class="w"> </span><span class="mi">9</span><span class="p">,</span><span class="w"> </span><span class="mi">56</span><span class="p">,</span><span class="w"> </span><span class="mi">123</span><span class="p">,</span><span class="w"> </span><span class="mi">456</span><span class="p">];</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">needle</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">123</span><span class="p">;</span>
<span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">needleTest</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">n</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="n">needle</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">assert</span><span class="p">(</span><span class="n">find</span><span class="p">(</span><span class="n">haystack</span><span class="p">,</span><span class="w"> </span><span class="p">&</span><span class="n">needleTest</span><span class="p">));</span>
<span class="p">}</span>
</pre></div>
<p>The difference between a <a href="Delegate_(CLI)" title="Delegate (CLI)">delegate</a> and a <a href="Closure_(computer_science)" class="mw-redirect" title="Closure (computer science)">closure</a> in D is automatically and conservatively determined by the compiler. D also supports function literals, that allow a lambda-style definition:
</p>
<div class="mw-highlight mw-highlight-lang-d mw-content-ltr" dir="ltr"><pre><span class="kt">void</span><span class="w"> </span><span class="n">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="p">[]</span><span class="w"> </span><span class="n">haystack</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">[</span><span class="mi">345</span><span class="p">,</span><span class="w"> </span><span class="mi">15</span><span class="p">,</span><span class="w"> </span><span class="mi">457</span><span class="p">,</span><span class="w"> </span><span class="mi">9</span><span class="p">,</span><span class="w"> </span><span class="mi">56</span><span class="p">,</span><span class="w"> </span><span class="mi">123</span><span class="p">,</span><span class="w"> </span><span class="mi">456</span><span class="p">];</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">needle</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">123</span><span class="p">;</span>
<span class="w"> </span><span class="k">assert</span><span class="p">(</span><span class="n">find</span><span class="p">(</span><span class="n">haystack</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">n</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="n">needle</span><span class="p">;</span><span class="w"> </span><span class="p">}));</span>
<span class="p">}</span>
</pre></div>
<p>To allow the compiler to inline the code (see above), function objects can also be specified C++-style via <a href="Operator_overloading" title="Operator overloading">operator overloading</a>:
</p>
<div class="mw-highlight mw-highlight-lang-d mw-content-ltr" dir="ltr"><pre><span class="kt">bool</span><span class="w"> </span><span class="n">find</span><span class="p">(</span><span class="n">T</span><span class="p">,</span><span class="w"> </span><span class="n">F</span><span class="p">)(</span><span class="n">T</span><span class="p">[]</span><span class="w"> </span><span class="n">haystack</span><span class="p">,</span><span class="w"> </span><span class="n">F</span><span class="w"> </span><span class="n">needle_test</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">straw</span><span class="p">;</span><span class="w"> </span><span class="n">haystack</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">needle_test</span><span class="p">(</span><span class="n">straw</span><span class="p">))</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">true</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">void</span><span class="w"> </span><span class="n">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="p">[]</span><span class="w"> </span><span class="n">haystack</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">[</span><span class="mi">345</span><span class="p">,</span><span class="w"> </span><span class="mi">15</span><span class="p">,</span><span class="w"> </span><span class="mi">457</span><span class="p">,</span><span class="w"> </span><span class="mi">9</span><span class="p">,</span><span class="w"> </span><span class="mi">56</span><span class="p">,</span><span class="w"> </span><span class="mi">123</span><span class="p">,</span><span class="w"> </span><span class="mi">456</span><span class="p">];</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">needle</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">123</span><span class="p">;</span>
<span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="n">NeedleTest</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">needle</span><span class="p">;</span>
<span class="w"> </span><span class="k">this</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">n</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">needle</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">n</span><span class="p">;</span><span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="n">opCall</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">n</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="n">needle</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">assert</span><span class="p">(</span><span class="n">find</span><span class="p">(</span><span class="n">haystack</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">NeedleTest</span><span class="p">(</span><span class="n">needle</span><span class="p">)));</span>
<span class="p">}</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="In_Eiffel">In Eiffel</h2></div>
<p>In the <a href="Eiffel_(programming_language)" title="Eiffel (programming language)">Eiffel</a> software development method and language, operations and objects are seen always as separate concepts. However, the <a href="Eiffel_(programming_language)#Agents" title="Eiffel (programming language)">agent</a> mechanism facilitates the modeling of operations as runtime objects. Agents satisfy the range of application attributed to function objects, such as being passed as arguments in procedural calls or specified as callback routines. The design of the agent mechanism in Eiffel attempts to reflect the object-oriented nature of the method and language. An agent is an object that generally is a direct instance of one of the two library classes, which model the two types of routines in Eiffel: <code>PROCEDURE</code> and <code>FUNCTION</code>. These two classes descend from the more abstract <code>ROUTINE</code>.
</p><p>Within software text, the language keyword <code>agent</code> allows agents to be constructed in a compact form. In the following example, the goal is to add the action of stepping the gauge forward to the list of actions to be executed in the event that a button is clicked.
</p>
<div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span class="n">my_button</span><span class="p">.</span><span class="n">select_actions</span><span class="p">.</span><span class="n">extend</span><span class="w"> </span><span class="p">(</span><span class="kr">agent</span><span class="w"> </span><span class="n">my_gauge</span><span class="p">.</span><span class="n">step_forward</span><span class="p">)</span>
</pre></div>
<p>The routine <code>extend</code> referenced in the example above is a feature of a class in a <a href="Graphical_user_interface" title="Graphical user interface">graphical user interface</a> (GUI) library to provide <a href="Event-driven_programming" title="Event-driven programming">event-driven programming</a> capabilities.
</p><p>In other library classes, agents are seen to be used for different purposes. In a library supporting data structures, for example, a class modeling linear structures effects <a href="Universal_quantification" title="Universal quantification">universal quantification</a> with a function <code>for_all</code> of type <code>BOOLEAN</code> that accepts an agent, an instance of <code>FUNCTION</code>, as an argument. So, in the following example, <code>my_action</code> is executed only if all members of <code>my_list</code> contain the character '!':
</p>
<div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span class="w"> </span><span class="n">my_list</span><span class="p">:</span><span class="w"> </span><span class="nc">LINKED_LIST</span><span class="w"> </span><span class="o">[</span><span class="nc">STRING</span><span class="o">]</span>
<span class="w"> </span><span class="p">...</span>
<span class="w"> </span><span class="kr">if</span><span class="w"> </span><span class="n">my_list</span><span class="p">.</span><span class="n">for_all</span><span class="w"> </span><span class="p">(</span><span class="kr">agent</span><span class="w"> </span><span class="p">{</span><span class="nc">STRING</span><span class="p">}.</span><span class="n">has</span><span class="w"> </span><span class="p">(</span><span class="sc">'!'</span><span class="p">))</span><span class="w"> </span><span class="kr">then</span>
<span class="w"> </span><span class="n">my_action</span>
<span class="w"> </span><span class="kr">end</span>
<span class="w"> </span><span class="p">...</span>
</pre></div>
<p>When agents are created, the arguments to the routines they model and even the target object to which they are applied can be either <i>closed</i> or left <i>open</i>. Closed arguments and targets are given values at agent creation time. The assignment of values for open arguments and targets is deferred until some point after the agent is created. The routine <code>for_all</code> expects as an argument an agent representing a function with one open argument or target that conforms to actual generic parameter for the structure (<code>STRING</code> in this example.)
</p><p>When the target of an agent is left open, the class name of the expected target, enclosed in braces, is substituted for an object reference as shown in the text <code>agent {STRING}.has ('!')</code> in the example above. When an argument is left open, the question mark character ('?') is coded as a placeholder for the open argument.
</p><p>The ability to close or leave open targets and arguments is intended to improve the flexibility of the agent mechanism. Consider a class that contains the following procedure to print a string on standard output after a new line:
</p>
<div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span class="w"> </span><span class="n">print_on_new_line</span><span class="w"> </span><span class="p">(</span><span class="n">s</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">)</span>
<span class="w"> </span><span class="c1">-- Print `s' preceded by a new line</span>
<span class="w"> </span><span class="kr">do</span>
<span class="w"> </span><span class="n">print</span><span class="w"> </span><span class="p">(</span><span class="s">"%N"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">s</span><span class="p">)</span>
<span class="w"> </span><span class="kr">end</span>
</pre></div>
<p>The following snippet, assumed to be in the same class, uses <code>print_on_new_line</code> to demonstrate the mixing of open arguments and open targets in agents used as arguments to the same routine.
</p>
<div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span class="w"> </span><span class="n">my_list</span><span class="p">:</span><span class="w"> </span><span class="nc">LINKED_LIST</span><span class="w"> </span><span class="o">[</span><span class="nc">STRING</span><span class="o">]</span>
<span class="w"> </span><span class="p">...</span>
<span class="w"> </span><span class="n">my_list</span><span class="p">.</span><span class="n">do_all</span><span class="w"> </span><span class="p">(</span><span class="kr">agent</span><span class="w"> </span><span class="n">print_on_new_line</span><span class="w"> </span><span class="p">(</span><span class="o">?</span><span class="p">))</span>
<span class="w"> </span><span class="n">my_list</span><span class="p">.</span><span class="n">do_all</span><span class="w"> </span><span class="p">(</span><span class="kr">agent</span><span class="w"> </span><span class="p">{</span><span class="nc">STRING</span><span class="p">}.</span><span class="n">to_lower</span><span class="p">)</span>
<span class="w"> </span><span class="n">my_list</span><span class="p">.</span><span class="n">do_all</span><span class="w"> </span><span class="p">(</span><span class="kr">agent</span><span class="w"> </span><span class="n">print_on_new_line</span><span class="w"> </span><span class="p">(</span><span class="o">?</span><span class="p">))</span>
<span class="w"> </span><span class="p">...</span>
</pre></div>
<p>This example uses the procedure <code>do_all</code> for linear structures, which executes the routine modeled by an agent for each item in the structure.
</p><p>The sequence of three instructions prints the strings in <code>my_list</code>, converts the strings to lowercase, and then prints them again.
</p><p>Procedure <code>do_all</code> iterates across the structure executing the routine substituting the current item for either the open argument (in the case of the agents based on <code>print_on_new_line</code>), or the open target (in the case of the agent based on <code>to_lower</code>).
</p><p>Open and closed arguments and targets also allow the use of routines that call for more arguments than are required by closing all but the necessary number of arguments:
</p>
<div class="mw-highlight mw-highlight-lang-eiffel mw-content-ltr" dir="ltr"><pre><span class="n">my_list</span><span class="p">.</span><span class="n">do_all</span><span class="w"> </span><span class="p">(</span><span class="kr">agent</span><span class="w"> </span><span class="n">my_multi_arg_procedure</span><span class="w"> </span><span class="p">(</span><span class="n">closed_arg_1</span><span class="p">,</span><span class="w"> </span><span class="o">?</span><span class="p">,</span><span class="w"> </span><span class="n">closed_arg_2</span><span class="p">,</span><span class="w"> </span><span class="n">closed_arg_3</span><span class="p">)</span>
</pre></div>
<p>The Eiffel agent mechanism is detailed in the <a rel="nofollow" class="external text" href="http://www.ecma-international.org/publications/standards/Ecma-367.htm">Eiffel ISO/ECMA standard document</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="In_Java">In Java</h2></div>
<p><a href="Java_(programming_language)" title="Java (programming language)">Java</a> has no <a href="First-class_function" title="First-class function">first-class functions</a>, so function objects are usually expressed by an interface with a single method (most commonly the <code>Callable</code> interface), typically with the implementation being an anonymous <a href="Inner_class" title="Inner class">inner class</a>, or, starting in Java 8, a <a href="Anonymous_function" title="Anonymous function">lambda</a>.
</p><p>For an example from Java's standard library, <code>java.util.Collections.sort()</code> takes a <code>List</code> and a functor whose role is to compare objects in the List. Without first-class functions, the function is part of the Comparator interface. This could be used as follows.
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span class="n">List</span><span class="o"><</span><span class="n">String</span><span class="o">></span><span class="w"> </span><span class="n">list</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Arrays</span><span class="p">.</span><span class="na">asList</span><span class="p">(</span><span class="s">"10"</span><span class="p">,</span><span class="w"> </span><span class="s">"1"</span><span class="p">,</span><span class="w"> </span><span class="s">"20"</span><span class="p">,</span><span class="w"> </span><span class="s">"11"</span><span class="p">,</span><span class="w"> </span><span class="s">"21"</span><span class="p">,</span><span class="w"> </span><span class="s">"12"</span><span class="p">);</span>
<span class="n">Comparator</span><span class="o"><</span><span class="n">String</span><span class="o">></span><span class="w"> </span><span class="n">numStringComparator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Comparator</span><span class="o"><</span><span class="n">String</span><span class="o">></span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">compare</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">str1</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">str2</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">Integer</span><span class="p">.</span><span class="na">valueOf</span><span class="p">(</span><span class="n">str1</span><span class="p">).</span><span class="na">compareTo</span><span class="p">(</span><span class="n">Integer</span><span class="p">.</span><span class="na">valueOf</span><span class="p">(</span><span class="n">str2</span><span class="p">));</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">};</span>
<span class="n">Collections</span><span class="p">.</span><span class="na">sort</span><span class="p">(</span><span class="n">list</span><span class="p">,</span><span class="w"> </span><span class="n">numStringComparator</span><span class="p">);</span>
</pre></div>
<p>In Java 8+, this can be written as:
</p>
<div class="mw-highlight mw-highlight-lang-java mw-content-ltr" dir="ltr"><pre><span class="n">List</span><span class="o"><</span><span class="n">String</span><span class="o">></span><span class="w"> </span><span class="n">list</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Arrays</span><span class="p">.</span><span class="na">asList</span><span class="p">(</span><span class="s">"10"</span><span class="p">,</span><span class="w"> </span><span class="s">"1"</span><span class="p">,</span><span class="w"> </span><span class="s">"20"</span><span class="p">,</span><span class="w"> </span><span class="s">"11"</span><span class="p">,</span><span class="w"> </span><span class="s">"21"</span><span class="p">,</span><span class="w"> </span><span class="s">"12"</span><span class="p">);</span>
<span class="n">Comparator</span><span class="o"><</span><span class="n">String</span><span class="o">></span><span class="w"> </span><span class="n">numStringComparator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">str1</span><span class="p">,</span><span class="w"> </span><span class="n">str2</span><span class="p">)</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">Integer</span><span class="p">.</span><span class="na">valueOf</span><span class="p">(</span><span class="n">str1</span><span class="p">).</span><span class="na">compareTo</span><span class="p">(</span><span class="n">Integer</span><span class="p">.</span><span class="na">valueOf</span><span class="p">(</span><span class="n">str2</span><span class="p">));</span>
<span class="n">Collections</span><span class="p">.</span><span class="na">sort</span><span class="p">(</span><span class="n">list</span><span class="p">,</span><span class="w"> </span><span class="n">numStringComparator</span><span class="p">);</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="In_JavaScript">In JavaScript</h2></div>
<p>In <a href="JavaScript" title="JavaScript">JavaScript</a>, functions are first class objects. JavaScript also supports closures.
</p><p>Compare the following with the subsequent Python example.
</p>
<div class="mw-highlight mw-highlight-lang-javascript mw-content-ltr" dir="ltr"><pre><span class="kd">function</span><span class="w"> </span><span class="nx">Accumulator</span><span class="p">(</span><span class="nx">start</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nx">current</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">start</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kd">function</span><span class="w"> </span><span class="p">(</span><span class="nx">x</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">current</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="nx">x</span><span class="p">;</span>
<span class="w"> </span><span class="p">};</span>
<span class="p">}</span>
</pre></div>
<p>An example of this in use:
</p>
<div class="mw-highlight mw-highlight-lang-javascript mw-content-ltr" dir="ltr"><pre><span class="kd">var</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">Accumulator</span><span class="p">(</span><span class="mf">4</span><span class="p">);</span>
<span class="kd">var</span><span class="w"> </span><span class="nx">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">a</span><span class="p">(</span><span class="mf">5</span><span class="p">);</span><span class="w"> </span><span class="c1">// x has value 9</span>
<span class="nx">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">a</span><span class="p">(</span><span class="mf">2</span><span class="p">);</span><span class="w"> </span><span class="c1">// x has value 11</span>
<span class="kd">var</span><span class="w"> </span><span class="nx">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">Accumulator</span><span class="p">(</span><span class="mf">42</span><span class="p">);</span>
<span class="nx">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">b</span><span class="p">(</span><span class="mf">7</span><span class="p">);</span><span class="w"> </span><span class="c1">// x has value 49 (current = 49 in closure b)</span>
<span class="nx">x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">a</span><span class="p">(</span><span class="mf">7</span><span class="p">);</span><span class="w"> </span><span class="c1">// x has value 18 (current = 18 in closure a)</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="In_Julia">In Julia</h2></div>
<p>In <a href="Julia_(programming_language)" title="Julia (programming language)">Julia</a>, methods are associated with types, so it is possible to make any arbitrary Julia object "callable" by adding methods to its type. (Such "callable" objects are sometimes called "functors.")
</p><p>An example is this accumulator mutable struct (based on <a href="Paul_Graham_(computer_programmer)" class="mw-redirect" title="Paul Graham (computer programmer)">Paul Graham's</a> study on programming language syntax and clarity):<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-julia-repl mw-content-ltr" dir="ltr"><pre><span class="gp">julia></span><span class="w"> </span><span class="k">mutable</span><span class="w"> </span><span class="k">struct</span> <span class="kt">Accumulator</span>
<span class="w"> </span><span class="n">n</span><span class="o">::</span><span class="kt">Int</span>
<span class="w"> </span><span class="k">end</span>
<span class="gp">julia></span><span class="w"> </span><span class="k">function</span><span class="w"> </span><span class="p">(</span><span class="n">acc</span><span class="o">::</span><span class="kt">Accumulator</span><span class="p">)(</span><span class="n">n2</span><span class="p">)</span>
<span class="w"> </span><span class="n">acc</span><span class="o">.</span><span class="n">n</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">n2</span>
<span class="w"> </span><span class="k">end</span>
<span class="gp">julia></span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Accumulator</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="go">Accumulator(4)</span>
<span class="gp">julia></span><span class="w"> </span><span class="n">a</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="go">9</span>
<span class="gp">julia></span><span class="w"> </span><span class="n">a</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="go">11</span>
<span class="gp">julia></span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Accumulator</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<span class="go">Accumulator(42)</span>
<span class="gp">julia></span><span class="w"> </span><span class="n">b</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span>
<span class="go">49</span>
</pre></div>
<p>Such an accumulator can also be implemented using closure:
</p>
<div class="mw-highlight mw-highlight-lang-julia-repl mw-content-ltr" dir="ltr"><pre><span class="gp">julia></span><span class="w"> </span><span class="k">function</span><span class="w"> </span><span class="n">Accumulator</span><span class="p">(</span><span class="n">n0</span><span class="p">)</span>
<span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">n0</span>
<span class="w"> </span><span class="k">function</span><span class="p">(</span><span class="n">n2</span><span class="p">)</span>
<span class="w"> </span><span class="n">n</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="n">n2</span>
<span class="w"> </span><span class="k">end</span>
<span class="w"> </span><span class="k">end</span>
<span class="go">Accumulator (generic function with 1 method)</span>
<span class="gp">julia></span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Accumulator</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="go">(::#1) (generic function with 1 method)</span>
<span class="gp">julia></span><span class="w"> </span><span class="n">a</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="go">9</span>
<span class="gp">julia></span><span class="w"> </span><span class="n">a</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="go">11</span>
<span class="gp">julia></span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Accumulator</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<span class="go">(::#1) (generic function with 1 method)</span>
<span class="gp">julia></span><span class="w"> </span><span class="n">b</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span>
<span class="go">49</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="In_Lisp_and_Scheme">In Lisp and Scheme</h2></div>
<p>In Lisp family languages such as <a href="Common_Lisp" title="Common Lisp">Common Lisp</a>, <a href="Scheme_(programming_language)" title="Scheme (programming language)">Scheme</a>, and others, functions are objects, just like strings, vectors, lists, and numbers. A closure-constructing operator creates a <i>function object</i> from a part of the program: the part of code given as an argument to the operator is part of the function, and so is the lexical environment: the bindings of the lexically visible variables are <i>captured</i> and stored in the function object, which is more commonly called a <a href="Closure_(computer_science)" class="mw-redirect" title="Closure (computer science)">closure</a>. The captured bindings play the role of <i>member variables</i>, and the code part of the closure plays the role of the <i>anonymous member function</i>, just like operator () in C++.
</p><p>The closure constructor has the syntax <code>(lambda (parameters ...) code ...)</code>. The <code>(parameters ...)</code> part allows an interface to be declared, so that the function takes the declared parameters. The <code>code ...</code> part consists of expressions that are evaluated when the functor is called.
</p><p>Many uses of functors in languages like C++ are simply emulations of the missing closure constructor. Since the programmer cannot directly construct a closure, they must define a class that has all of the necessary state variables, and also a member function. Then, construct an instance of that class instead, ensuring that all the member variables are initialized through its constructor. The values are derived precisely from those local variables that ought to be captured directly by a closure.
</p><p>A function-object using the class system in Common Lisp, no use of closures:
</p>
<div class="mw-highlight mw-highlight-lang-lisp mw-content-ltr" dir="ltr"><pre><span class="p">(</span><span class="nb">defclass</span><span class="w"> </span><span class="nv">counter</span><span class="w"> </span><span class="p">()</span>
<span class="w"> </span><span class="p">((</span><span class="nv">value</span><span class="w"> </span><span class="ss">:initarg</span><span class="w"> </span><span class="ss">:value</span><span class="w"> </span><span class="ss">:accessor</span><span class="w"> </span><span class="nv">value-of</span><span class="p">)))</span>
<span class="p">(</span><span class="nb">defmethod</span><span class="w"> </span><span class="nv">functor-call</span><span class="w"> </span><span class="p">((</span><span class="nv">c</span><span class="w"> </span><span class="nv">counter</span><span class="p">))</span>
<span class="w"> </span><span class="p">(</span><span class="nb">incf</span><span class="w"> </span><span class="p">(</span><span class="nv">value-of</span><span class="w"> </span><span class="nv">c</span><span class="p">)))</span>
<span class="p">(</span><span class="nb">defun</span><span class="w"> </span><span class="nv">make-counter</span><span class="w"> </span><span class="p">(</span><span class="nv">initial-value</span><span class="p">)</span>
<span class="w"> </span><span class="p">(</span><span class="nb">make-instance</span><span class="w"> </span><span class="ss">'counter</span><span class="w"> </span><span class="ss">:value</span><span class="w"> </span><span class="nv">initial-value</span><span class="p">))</span>
<span class="c1">;;; use the counter:</span>
<span class="p">(</span><span class="nb">defvar</span><span class="w"> </span><span class="vg">*c*</span><span class="w"> </span><span class="p">(</span><span class="nv">make-counter</span><span class="w"> </span><span class="mi">10</span><span class="p">))</span>
<span class="p">(</span><span class="nv">functor-call</span><span class="w"> </span><span class="vg">*c*</span><span class="p">)</span><span class="w"> </span><span class="nv">--></span><span class="w"> </span><span class="mi">11</span>
<span class="p">(</span><span class="nv">functor-call</span><span class="w"> </span><span class="vg">*c*</span><span class="p">)</span><span class="w"> </span><span class="nv">--></span><span class="w"> </span><span class="mi">12</span>
</pre></div>
<p>Since there is no standard way to make funcallable objects in Common Lisp, we fake it by defining a <a href="Generic_function" title="Generic function">generic function</a> called FUNCTOR-CALL. This can be specialized for any class whatsoever. The standard FUNCALL function is not generic; it only takes function objects.
</p><p>It is this FUNCTOR-CALL generic function that gives us function objects, which are <i>a computer programming construct allowing an object to be invoked or called as if it were an ordinary function, usually with the same syntax.</i> We have <i>almost</i> the same syntax: FUNCTOR-CALL instead of FUNCALL. Some Lisps provide <i>funcallable</i> objects as a simple extension. Making objects callable using the same syntax as functions is a fairly trivial business. Making a function call operator work with different kinds of <i>function things</i>, whether they be class objects or closures is no more complicated than making a + operator that works with different kinds of numbers, such as integers, reals or complex numbers.
</p><p>Now, a counter implemented using a closure. This is much more brief and direct. The INITIAL-VALUE argument of the MAKE-COUNTER <a href="Factory_function" class="mw-redirect" title="Factory function">factory function</a> is captured and used directly. It does not have to be copied into some auxiliary class object through a constructor. It <i>is</i> the counter. An auxiliary object is created, but that happens <i>behind the scenes</i>.
</p>
<div class="mw-highlight mw-highlight-lang-lisp mw-content-ltr" dir="ltr"><pre><span class="p">(</span><span class="nb">defun</span><span class="w"> </span><span class="nv">make-counter</span><span class="w"> </span><span class="p">(</span><span class="nv">value</span><span class="p">)</span>
<span class="w"> </span><span class="p">(</span><span class="k">lambda</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">(</span><span class="nb">incf</span><span class="w"> </span><span class="nv">value</span><span class="p">)))</span>
<span class="c1">;;; use the counter</span>
<span class="p">(</span><span class="nb">defvar</span><span class="w"> </span><span class="vg">*c*</span><span class="w"> </span><span class="p">(</span><span class="nv">make-counter</span><span class="w"> </span><span class="mi">10</span><span class="p">))</span>
<span class="p">(</span><span class="nb">funcall</span><span class="w"> </span><span class="vg">*c*</span><span class="p">)</span><span class="w"> </span><span class="c1">; --> 11</span>
<span class="p">(</span><span class="nb">funcall</span><span class="w"> </span><span class="vg">*c*</span><span class="p">)</span><span class="w"> </span><span class="c1">; --> 12</span>
</pre></div>
<p>Scheme makes closures even simpler, and Scheme code tends to use such <a href="Higher-order_programming" title="Higher-order programming">higher-order programming</a> somewhat more idiomatically.
</p>
<div class="mw-highlight mw-highlight-lang-scheme mw-content-ltr" dir="ltr"><pre><span class="p">(</span><span class="k">define</span><span class="w"> </span><span class="p">(</span><span class="nf">make-counter</span><span class="w"> </span><span class="nv">value</span><span class="p">)</span>
<span class="w"> </span><span class="p">(</span><span class="k">lambda</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">(</span><span class="k">set!</span><span class="w"> </span><span class="nv">value</span><span class="w"> </span><span class="p">(</span><span class="nb">+</span><span class="w"> </span><span class="nv">value</span><span class="w"> </span><span class="mi">1</span><span class="p">))</span><span class="w"> </span><span class="nv">value</span><span class="p">))</span>
<span class="c1">;;; use the counter</span>
<span class="p">(</span><span class="k">define</span><span class="w"> </span><span class="nv">c</span><span class="w"> </span><span class="p">(</span><span class="nf">make-counter</span><span class="w"> </span><span class="mi">10</span><span class="p">))</span>
<span class="p">(</span><span class="nf">c</span><span class="p">)</span><span class="w"> </span><span class="c1">; --> 11</span>
<span class="p">(</span><span class="nf">c</span><span class="p">)</span><span class="w"> </span><span class="c1">; --> 12</span>
</pre></div>
<p>More than one closure can be created in the same lexical environment. A vector of closures, each implementing a specific kind of operation, can quite faithfully emulate an object that has a set of virtual operations. That type of <a href="Single_dispatch" class="mw-redirect" title="Single dispatch">single dispatch</a> object-oriented programming can be done fully with closures.
</p><p>Thus there exists a kind of tunnel being dug from both sides of the proverbial mountain. Programmers in OOP languages discover function objects by restricting objects to have one <i>main</i> function to <i>do</i> that object's functional purpose, and even eliminate its name so that it looks like the object is being called! While programmers who use closures are not surprised that an object is called like a function, they discover that multiple closures sharing the same environment can provide a complete set of abstract operations like a virtual table for <a href="Single_dispatch" class="mw-redirect" title="Single dispatch">single dispatch</a> type OOP.
</p>
<div class="mw-heading mw-heading2"><h2 id="In_Objective-C">In Objective-C</h2></div>
<p>In <a href="Objective-C" title="Objective-C">Objective-C</a>, a function object can be created from the <code>NSInvocation</code> class. Construction of a function object requires a method signature, the target object, and the target selector. Here is an example for creating an invocation to the current object's <code>myMethod</code>:
</p>
<div class="mw-highlight mw-highlight-lang-objc mw-content-ltr" dir="ltr"><pre><span class="c1">// Construct a function object</span>
<span class="kt">SEL</span><span class="w"> </span><span class="n">sel</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">@selector</span><span class="p">(</span><span class="n">myMethod</span><span class="p">);</span>
<span class="bp">NSInvocation</span><span class="o">*</span><span class="w"> </span><span class="n">inv</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="bp">NSInvocation</span><span class="w"> </span><span class="n">invocationWithMethodSignature</span><span class="o">:</span>
<span class="w"> </span><span class="p">[</span><span class="nb">self</span><span class="w"> </span><span class="n">methodSignatureForSelector</span><span class="o">:</span><span class="n">sel</span><span class="p">]];</span>
<span class="p">[</span><span class="n">inv</span><span class="w"> </span><span class="n">setTarget</span><span class="o">:</span><span class="nb">self</span><span class="p">];</span>
<span class="p">[</span><span class="n">inv</span><span class="w"> </span><span class="n">setSelector</span><span class="o">:</span><span class="n">sel</span><span class="p">];</span>
<span class="c1">// Do the actual invocation</span>
<span class="p">[</span><span class="n">inv</span><span class="w"> </span><span class="n">invoke</span><span class="p">];</span>
</pre></div>
<p>An advantage of <code>NSInvocation</code> is that the target object can be modified after creation. A single <code>NSInvocation</code> can be created and then called for each of any number of targets, for instance from an observable object. An <code>NSInvocation</code> can be created from only a protocol, but it is not straightforward. See <a rel="nofollow" class="external text" href="https://web.archive.org/web/20110227215311/http://www.a-coding.com/2010/10/making-nsinvocations.html">here</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="In_Perl">In Perl</h2></div>
<p>In <a href="Perl" title="Perl">Perl</a>, a function object can be created either from a class's constructor returning a function closed over the object's instance data, blessed into the class:
</p>
<div class="mw-highlight mw-highlight-lang-perl mw-content-ltr" dir="ltr"><pre><span class="k">package</span><span class="w"> </span><span class="nn">Acc1</span><span class="p">;</span>
<span class="k">sub</span><span class="w"> </span><span class="nf">new</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">$class</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">shift</span><span class="p">;</span>
<span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">$arg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">shift</span><span class="p">;</span>
<span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">$obj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">sub</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">$num</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">shift</span><span class="p">;</span>
<span class="w"> </span><span class="nv">$arg</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="nv">$num</span><span class="p">;</span>
<span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="nb">bless</span><span class="w"> </span><span class="nv">$obj</span><span class="p">,</span><span class="w"> </span><span class="nv">$class</span><span class="p">;</span>
<span class="p">}</span>
<span class="mi">1</span><span class="p">;</span>
</pre></div>
<p>or by overloading the <code>&{}</code> operator so that the object can be used as a function:
</p>
<div class="mw-highlight mw-highlight-lang-perl mw-content-ltr" dir="ltr"><pre><span class="k">package</span><span class="w"> </span><span class="nn">Acc2</span><span class="p">;</span>
<span class="k">use</span><span class="w"> </span><span class="nn">overload</span>
<span class="w"> </span><span class="s">'&{}'</span><span class="w"> </span><span class="o">=></span>
<span class="w"> </span><span class="k">sub</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">$self</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">shift</span><span class="p">;</span>
<span class="w"> </span><span class="k">sub</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">$num</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">shift</span><span class="p">;</span>
<span class="w"> </span><span class="nv">$self</span><span class="o">-></span><span class="p">{</span><span class="n">arg</span><span class="p">}</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="nv">$num</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="p">};</span>
<span class="k">sub</span><span class="w"> </span><span class="nf">new</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">$class</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">shift</span><span class="p">;</span>
<span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">$arg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">shift</span><span class="p">;</span>
<span class="w"> </span><span class="k">my</span><span class="w"> </span><span class="nv">$obj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">arg</span><span class="w"> </span><span class="o">=></span><span class="w"> </span><span class="nv">$arg</span><span class="w"> </span><span class="p">};</span>
<span class="w"> </span><span class="nb">bless</span><span class="w"> </span><span class="nv">$obj</span><span class="p">,</span><span class="w"> </span><span class="nv">$class</span><span class="p">;</span>
<span class="p">}</span>
<span class="mi">1</span><span class="p">;</span>
</pre></div>
<p>In both cases the function object can be used either using the dereferencing arrow syntax <i>$ref->(@arguments)</i>:
</p>
<div class="mw-highlight mw-highlight-lang-perl mw-content-ltr" dir="ltr"><pre><span class="k">use</span><span class="w"> </span><span class="nn">Acc1</span><span class="p">;</span>
<span class="k">my</span><span class="w"> </span><span class="nv">$a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nn">Acc1</span><span class="o">-></span><span class="k">new</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span>
<span class="k">print</span><span class="w"> </span><span class="nv">$a</span><span class="o">-></span><span class="p">(</span><span class="mi">10</span><span class="p">),</span><span class="w"> </span><span class="s">"\n"</span><span class="p">;</span><span class="w"> </span><span class="c1"># prints 52</span>
<span class="k">print</span><span class="w"> </span><span class="nv">$a</span><span class="o">-></span><span class="p">(</span><span class="mi">8</span><span class="p">),</span><span class="w"> </span><span class="s">"\n"</span><span class="p">;</span><span class="w"> </span><span class="c1"># prints 60</span>
</pre></div>
<p>or using the coderef dereferencing syntax <i>&$ref(@arguments)</i>:
</p>
<div class="mw-highlight mw-highlight-lang-perl mw-content-ltr" dir="ltr"><pre><span class="k">use</span><span class="w"> </span><span class="nn">Acc2</span><span class="p">;</span>
<span class="k">my</span><span class="w"> </span><span class="nv">$a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nn">Acc2</span><span class="o">-></span><span class="k">new</span><span class="p">(</span><span class="mi">12</span><span class="p">);</span>
<span class="k">print</span><span class="w"> </span><span class="o">&</span><span class="nv">$a</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span><span class="w"> </span><span class="s">"\n"</span><span class="p">;</span><span class="w"> </span><span class="c1"># prints 22</span>
<span class="k">print</span><span class="w"> </span><span class="o">&</span><span class="nv">$a</span><span class="p">(</span><span class="mi">8</span><span class="p">),</span><span class="w"> </span><span class="s">"\n"</span><span class="p">;</span><span class="w"> </span><span class="c1"># prints 30</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="In_PHP">In PHP</h2></div>
<p><a href="PHP" title="PHP">PHP</a> 5.3+ has <a href="First-class_function" title="First-class function">first-class functions</a> that can be used e.g. as parameter to the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">usort()</code> function:
</p>
<div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"><pre><span class="nv">$a</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
<span class="nb">usort</span><span class="p">(</span><span class="nv">$a</span><span class="p">,</span> <span class="k">function</span> <span class="p">(</span><span class="nv">$x</span><span class="p">,</span> <span class="nv">$y</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nv">$x</span> <span class="o">-</span> <span class="nv">$y</span><span class="p">;</span> <span class="p">});</span>
</pre></div>
<p><a href="PHP" title="PHP">PHP</a> 5.3+, supports also lambda functions and closures.
</p>
<div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"><pre><span class="k">function</span> <span class="nf">Accumulator</span><span class="p">(</span><span class="nv">$start</span><span class="p">)</span>
<span class="p">{</span>
<span class="nv">$current</span> <span class="o">=</span> <span class="nv">$start</span><span class="p">;</span>
<span class="k">return</span> <span class="k">function</span><span class="p">(</span><span class="nv">$x</span><span class="p">)</span> <span class="k">use</span><span class="p">(</span><span class="o">&</span><span class="nv">$current</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nv">$current</span> <span class="o">+=</span> <span class="nv">$x</span><span class="p">;</span>
<span class="p">};</span>
<span class="p">}</span>
</pre></div>
<p>An example of this in use:
</p>
<div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"><pre><span class="nv">$a</span> <span class="o">=</span> <span class="nx">Accumulator</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span>
<span class="nv">$x</span> <span class="o">=</span> <span class="nv">$a</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span>
<span class="k">echo</span> <span class="s2">"x = </span><span class="si">$x</span><span class="s2"><br/>"</span><span class="p">;</span> <span class="c1">// x = 9</span>
<span class="nv">$x</span> <span class="o">=</span> <span class="nv">$a</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
<span class="k">echo</span> <span class="s2">"x = </span><span class="si">$x</span><span class="s2"><br/>"</span><span class="p">;</span> <span class="c1">// x = 11</span>
</pre></div>
<p>It is also possible in PHP 5.3+ to make objects invokable by adding a magic <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">__invoke()</code> method to their class:<sup id="cite_ref-phpinvoke_7-0" class="reference"><a href="#cite_note-phpinvoke-7"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-php mw-content-ltr" dir="ltr"><pre><span class="k">class</span> <span class="nc">Minus</span>
<span class="p">{</span>
<span class="k">public</span> <span class="k">function</span> <span class="fm">__invoke</span><span class="p">(</span><span class="nv">$x</span><span class="p">,</span> <span class="nv">$y</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nv">$x</span> <span class="o">-</span> <span class="nv">$y</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="nv">$a</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
<span class="nb">usort</span><span class="p">(</span><span class="nv">$a</span><span class="p">,</span> <span class="k">new</span> <span class="nx">Minus</span><span class="p">());</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="In_PowerShell">In PowerShell</h2></div>
<p>In the <a href="Windows_PowerShell" class="mw-redirect" title="Windows PowerShell">Windows PowerShell</a> language, a script block is a collection of statements or expressions that can be used as a single unit. A script block can accept arguments and return values. A script block is an instance of a Microsoft <a href=".NET_Framework" title=".NET Framework">.NET Framework</a> type System.Management.Automation.ScriptBlock.
</p>
<div class="mw-highlight mw-highlight-lang-powershell mw-content-ltr" dir="ltr"><pre><span class="k">Function</span> <span class="nb">Get-Accumulator</span><span class="p">(</span><span class="nv">$x</span><span class="p">)</span> <span class="p">{</span>
<span class="p">{</span>
<span class="k">param</span><span class="p">(</span><span class="nv">$y</span><span class="p">)</span>
<span class="k">return</span> <span class="nv">$x</span> <span class="p">+=</span> <span class="nv">$y</span>
<span class="p">}.</span><span class="n">GetNewClosure</span><span class="p">()</span>
<span class="p">}</span>
</pre></div>
<div class="mw-highlight mw-highlight-lang-ps1con mw-content-ltr" dir="ltr"><pre><span class="gp">PS C:\> </span><span class="nv">$a</span> <span class="p">=</span> <span class="nb">Get-Accumulator</span> <span class="n">4</span>
<span class="gp">PS C:\> </span><span class="p">&</span> <span class="nv">$a</span> <span class="n">5</span>
<span class="go">9</span>
<span class="gp">PS C:\> </span><span class="p">&</span> <span class="nv">$a</span> <span class="n">2</span>
<span class="go">11</span>
<span class="gp">PS C:\> </span><span class="nv">$b</span> <span class="p">=</span> <span class="nb">Get-Accumulator</span> <span class="n">32</span>
<span class="gp">PS C:\> </span><span class="p">&</span> <span class="nv">$b</span> <span class="n">10</span>
<span class="go">42</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="In_Python">In Python</h2></div>
<p>In <a href="Python_(programming_language)" title="Python (programming language)">Python</a>, functions are first-class objects, just like strings, numbers, lists etc. This feature eliminates the need to write a function object in many cases. Any object with a <code>__call__()</code> method can be called using function-call syntax.
</p><p>An example is this accumulator class (based on <a href="Paul_Graham_(computer_programmer)" class="mw-redirect" title="Paul Graham (computer programmer)">Paul Graham's</a> study on programming language syntax and clarity):<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-highlight mw-highlight-lang-python mw-content-ltr" dir="ltr"><pre><span class="k">class</span><span class="w"> </span><span class="nc">Accumulator</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">n</span> <span class="o">=</span> <span class="n">n</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">x</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">n</span> <span class="o">+=</span> <span class="n">x</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">n</span>
</pre></div>
<p>An example of this in use (using the interactive interpreter):
</p>
<div class="mw-highlight mw-highlight-lang-pycon mw-content-ltr" dir="ltr"><pre><span class="gp">>>> </span><span class="n">a</span> <span class="o">=</span> <span class="n">Accumulator</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">a</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
<span class="go">9</span>
<span class="gp">>>> </span><span class="n">a</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="go">11</span>
<span class="gp">>>> </span><span class="n">b</span> <span class="o">=</span> <span class="n">Accumulator</span><span class="p">(</span><span class="mi">42</span><span class="p">)</span>
<span class="gp">>>> </span><span class="n">b</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span>
<span class="go">49</span>
</pre></div>
<p>Since functions are objects, they can also be defined locally, given attributes, and returned by other functions,<sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup> as demonstrated in the following example:
</p>
<div class="mw-highlight mw-highlight-lang-python3 mw-content-ltr" dir="ltr"><pre><span class="k">def</span><span class="w"> </span><span class="nf">Accumulator</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="nf">inc</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<span class="k">nonlocal</span> <span class="n">n</span>
<span class="n">n</span> <span class="o">+=</span> <span class="n">x</span>
<span class="k">return</span> <span class="n">n</span>
<span class="k">return</span> <span class="n">inc</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="In_Ruby">In Ruby</h2></div>
<p>In <a href="Ruby_(programming_language)" title="Ruby (programming language)">Ruby</a>, several objects can be considered function objects, in particular Method and Proc objects. Ruby also has two kinds of objects that can be thought of as semi-function objects: UnboundMethod and block. UnboundMethods must first be bound to an object (thus becoming a Method) before they can be used as a function object. Blocks can be called like function objects, but to be used in any other capacity as an object (e.g. passed as an argument) they must first be converted to a Proc. More recently, symbols (accessed via the literal unary indicator <code>:</code>) can also be converted to <code>Proc</code>s. Using Ruby's unary <code>&</code> operator—equivalent to calling <code>to_proc</code> on an object, and <a href="Duck_typing" title="Duck typing">assuming that method exists</a>—the Ruby Extensions Project <a rel="nofollow" class="external text" href="https://web.archive.org/web/20060425104650/http://blogs.pragprog.com/cgi-bin/pragdave.cgi/Tech/Ruby/ToProc.rdoc">created a simple hack.</a>
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span class="k">class</span><span class="w"> </span><span class="nc">Symbol</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">to_proc</span>
<span class="w"> </span><span class="nb">proc</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="o">|</span><span class="n">obj</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">args</span><span class="o">|</span><span class="w"> </span><span class="n">obj</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="nb">self</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>
</pre></div>
<p>Now, method <code>foo</code> can be a function object, i.e. a <code>Proc</code>, via <code>&:foo</code> and used via <code>takes_a_functor(&:foo)</code>. <code>Symbol.to_proc</code> was officially added to Ruby on June 11, 2006, during RubyKaigi2006. <a rel="nofollow" class="external autonumber" href="https://web.archive.org/web/20060820025032/http://redhanded.hobix.com/cult/symbolTo_procExonerated.html">[1]</a>
</p><p>Because of the variety of forms, the term Functor is not generally used in Ruby to mean a Function object.
Just a type of dispatch <a href="Delegation_(programming)" class="mw-redirect" title="Delegation (programming)">delegation</a> introduced by the <a rel="nofollow" class="external text" href="https://web.archive.org/web/20070107205748/http://facets.rubyforge.org/">Ruby Facets</a> project is named as Functor. The most basic definition of which is:
</p>
<div class="mw-highlight mw-highlight-lang-ruby mw-content-ltr" dir="ltr"><pre><span class="k">class</span><span class="w"> </span><span class="nc">Functor</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">initialize</span><span class="p">(</span><span class="o">&</span><span class="n">func</span><span class="p">)</span>
<span class="w"> </span><span class="vi">@func</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">func</span>
<span class="w"> </span><span class="k">end</span>
<span class="w"> </span><span class="k">def</span><span class="w"> </span><span class="nf">method_missing</span><span class="p">(</span><span class="n">op</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">args</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">blk</span><span class="p">)</span>
<span class="w"> </span><span class="vi">@func</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">op</span><span class="p">,</span><span class="w"> </span><span class="o">*</span><span class="n">args</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">blk</span><span class="p">)</span>
<span class="w"> </span><span class="k">end</span>
<span class="k">end</span>
</pre></div>
<p>This usage is more akin to that used by functional programming languages, like <a href="ML_(programming_language)" title="ML (programming language)">ML</a>, and the original mathematical terminology.
</p>
<div class="mw-heading mw-heading2"><h2 id="Other_meanings">Other meanings</h2></div>
<p>In a more theoretical context a <i>function object</i> may be considered to be any instance of the class of functions, especially in languages such as <a href="Common_Lisp" title="Common Lisp">Common Lisp</a> in which functions are <a href="First-class_object" class="mw-redirect" title="First-class object">first-class objects</a>.
</p><p>The <a href="ML_(programming_language)" title="ML (programming language)">ML</a> family of <a href="Functional_programming" title="Functional programming">functional programming</a> languages uses the term <i>functor</i> to represent a <a href="Function_(mathematics)" title="Function (mathematics)">mapping</a> from modules to modules, or from types to types and is a technique for reusing code. Functors used in this manner are analogous to the original mathematical meaning of <a href="Functor" title="Functor">functor</a> in <a href="Category_theory" title="Category theory">category theory</a>, or to the use of generic programming in C++, Java or <a href="Ada_(programming_language)" title="Ada (programming language)">Ada</a>.
</p><p>In <a href="Haskell_(programming_language)" class="mw-redirect" title="Haskell (programming language)">Haskell</a>, the term <i><a href="Functor_(functional_programming)" title="Functor (functional programming)">functor</a></i> is also used for a concept related to the meaning of <i>functor</i> in category theory.
</p><p>In <a href="Prolog" title="Prolog">Prolog</a> and related languages, <i>functor</i> is a synonym for <a href="Function_symbol" class="mw-redirect" title="Function symbol">function symbol</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Callback_(computer_science)" class="mw-redirect" title="Callback (computer science)">Callback (computer science)</a></li>
<li><a href="Closure_(computer_science)" class="mw-redirect" title="Closure (computer science)">Closure (computer science)</a></li>
<li><a href="Function_pointer" title="Function pointer">Function pointer</a></li>
<li><a href="Higher-order_function" title="Higher-order function">Higher-order function</a></li>
<li><a href="Command_pattern" title="Command pattern">Command pattern</a></li>
<li><a href="Currying" title="Currying">Currying</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Notes">Notes</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */
.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}
/* end https://en.wikipedia.org/ */
</style><div class="reflist reflist-lower-alpha">
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text">In C++, a <b>functionoid</b> is an object that has one major method, and a <b>functor</b> is a special case of a functionoid.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> They are similar to a function object, <i>but not the same</i>.</span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<div class="reflist">
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://isocpp.org/wiki/faq/pointers-to-members#functor-vs-functionoid">What's the difference between a functionoid and a functor?</a></span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */
.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}
/* end https://en.wikipedia.org/ */
</style><cite id="CITEREFSilan_Liu" class="citation web cs1">Silan Liu. <a rel="nofollow" class="external text" href="http://progtutorials.tripod.com/cpp1.htm#_Toc50820124">"C++ Tutorial Part I - Basic: 5.10 Function pointers are mainly used to achieve call back technique, which will be discussed right after"</a>. TRIPOD: Programming Tutorials Copyright © Silan Liu 2002<span class="reference-accessdate">. Retrieved <span class="nowrap">2012-09-07</span></span>. <q>Function pointers are mainly used to achieve call back technique, which will be discussed right after.</q></cite></span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><cite id="CITEREFPaweł_Turlejski2009" class="citation web cs1">Paweł Turlejski (2009-10-02). <a rel="nofollow" class="external text" href="http://progtutorials.tripod.com/cpp1.htm#_Toc50820124">"C++ Tutorial Part I - Basic: 5.10 Function pointers are mainly used to achieve call back technique, which will be discussed right after"</a>. Just a Few Lines<span class="reference-accessdate">. Retrieved <span class="nowrap">2012-09-07</span></span>. <q>PHP 5.3, along with many other features, introduced closures. So now we can finally do all the cool stuff that Ruby / Groovy / Scala / any_modern_language guys can do, right? Well, we can, but we probably won't… Here's why.</q></cite></span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://en.cppreference.com/w/cpp/language/overload_resolution#Call_to_a_class_object">"Overload resolution§Call to a class object"</a>. <i>cppreference.com</i>.</cite></span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.paulgraham.com/accgen.html">Accumulator Generator</a></span>
</li>
<li id="cite_note-phpinvoke-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-phpinvoke_7-0">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://php.net/manual/en/language.oop5.magic.php#object.invoke">PHP Documentation on Magic Methods</a></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.paulgraham.com/accgen.html">Accumulator Generator</a></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="https://docs.python.org/3/reference/compound_stmts.html#function-definitions">Python reference manual - Function definitions</a></span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="Further_reading">Further reading</h2></div>
<ul><li>David Vandevoorde & Nicolai M Josuttis (2006). <i>C++ Templates: The Complete Guide</i>, <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a> <bdi>0-201-73484-2</bdi>: Specifically, chapter 22 is devoted to function objects.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://c2.com/cgi/wiki?FunctorObject">Description from the Portland Pattern Repository</a></li>
<li><a rel="nofollow" class="external text" href="http://www.two-sdg.demon.co.uk/curbralan/papers/AsynchronousC++.pdf">C++ Advanced Design Issues - Asynchronous C++</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20200922012516/http://www.two-sdg.demon.co.uk/curbralan/papers/AsynchronousC++.pdf">Archived</a> 2020-09-22 at the <a href="Wayback_Machine" title="Wayback Machine">Wayback Machine</a> by <a href="Kevlin_Henney" title="Kevlin Henney">Kevlin Henney</a></li>
<li><a rel="nofollow" class="external text" href="http://www.newty.de/fpt/index.html">The Function Pointer Tutorials</a> by Lars Haendel (2000/2001)</li>
<li>Article "<a rel="nofollow" class="external text" href="https://web.archive.org/web/20041009232434/http://www.cuj.com/documents/s%3D8464/cujcexp0308sutter/">Generalized Function Pointers</a>" by <a href="Herb_Sutter" title="Herb Sutter">Herb Sutter</a></li>
<li><a rel="nofollow" class="external text" href="https://jga.sourceforge.net/">Generic Algorithms for Java</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20100330073950/http://www.amcgowan.ca/blog/computer-science/php-functors-function-objects-in-php/">PHP Functors - Function Objects in PHP</a></li>
<li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20041013202445/http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.10">What the heck is a functionoid, and why would I use one?</a> (C++ FAQ)</li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-08-07" href="https://en.wikipedia.org/wiki/?title=Function_object&oldid=1304727969">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
</body></html>